package com.rock.code.common.utils.service.impl;

import com.rock.code.common.utils.service.EhCacheService;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class EhCacheServiceImpl implements EhCacheService {

    // Doc

    // @Cacheable：如果使用@Cacheable注解，先检查对应的缓存是否存在，如果缓存存在，直接取缓存值返回，不再执行方法体内容；如果缓存不存在，则执行方法体内容，并且将返回的内容写入缓存
    // @CachePut：使用@CachePut注解和@Cacheable注解类似，只是不管对应缓存是否存在，都执行方法体，并且将返回的内容写入缓存
    // @CacheEvict：@CacheEvict注解表示对应缓存的删除

    // resource.conf.cache为ehcache.xml中配置的缓存名称。
    // 类中使用到了Spring Expression Language（SpEL）,其中相关说明如下:
    // #root.methodName 被执行方法的名称
    // #root.method.name 被执行的方法
    // #root.target 被执行的目标对象
    // #root.targetClass 被执行的目标对象的class
    // #root.args[0] 调用目标方法的时候目标方法里面的参数（可将参数列表类比成对象数组）的第一个
    // #root.caches[0].name 获取当前执行方法的缓存

    @Cacheable(value = "resource.conf.cache", key = "#param")
    public String getTimestamp(String param) {
        Long timestamp = System.currentTimeMillis();
        return timestamp.toString();
    }

}